I made another Temporal polyfill from scratch
I made another Temporal polyfill from scratch
Temporalのpolyfillをゼロから実装した
なぜ新しい polyfill を作ったのか
既存の polyfill(@js-temporal/polyfill・temporal-polyfill)は最終仕様への未追従・バグ・巨大なバンドルサイズという問題があった
特に DST や era 定義などで仕様と異なる挙動があり、実運用で困るケースが多い。
著者は既存実装の構造上、修正が難しく、自作が最も現実的と判断
新 polyfill「temporal-polyfill-lite」の特徴
最終仕様(Stage 4)準拠
TypeScript 公式型定義 v6.0 と互換
最小クラスのバンドルサイズ(52 kb min)
Gregorian / ISO8601 に特化して軽量化
全タイムゾーン対応
内部整数表現を BigInt ではなく 2 要素配列で実装し、古い環境でも動作可能
仕様の擬似コードをほぼ逐語的に実装 → バグが減り、デバッグ容易
内部プロパティを $ / _ で始める命名規則にして安全にプロパティ圧縮
非 ISO カレンダーは条件付き import/export で追加可能(calendars-full)
実装上の工夫
Intl.DateTimeFormat の formatToParts を解析して UTC offset を算出
既存ライブラリと同様の手法
LRU キャッシュで offset 計算を高速化(改善中)
throw を関数化し minify 効率を上げるなど、徹底したサイズ削減
test262 のほぼ 100% カバレッジで検証
ICU4X と比較して非 ISO カレンダーの正確性を担保
バンドルサイズ比較(2026年4月時点)
native: 0 kB
temporal-polyfill-lite: 52.1 kB
temporal-polyfill-lite/calendars-full: 63.6 kB
temporal-polyfill: 57.0 kB
@js-temporal/polyfill: 159.7 kB
どの polyfill を使うべきか
バックエンド
バンドルサイズは気にしなくてよい → robustness が重要
現状は temporal-polyfill-lite が最良
Node.js v26 が LTS になる 2026年10月以降は polyfill 不要に
フロントエンド
まだ Temporal を使うのは早いが、SSG なら問題なし
temporal-polyfill-lite が最も軽量で実用的